<?php
/**
 * Created by PhpStorm.
 * User: guokunsheng
 * Date: 2018/6/6
 * Time: 22:48
 */

namespace app\api\controller\v2;

use app\common\cachemodel\Goods;
use app\common\lib\Aes;
use app\common\lib\exception\ApiException;
use app\api\controller\Common;
use app\common\lib\Util;
use app\common\model\User;
use app\miniapp\controller\AuthCheck;
use think\Cache;
use think\Db;
use think\Env;
use think\Log;


/**
 * 客户端auth登录权限基础类库
 * Class Auth
 * @package app\api\controller\v2
 */
class Auth extends Common
{
    /**
     * 登录用户的基本信息
     * @var array
     */
    public $user = [];
    public $miniInfo = [];
    public $is_apple_pay = false;//获取苹果支付模式，控制苹果商品显示
    public $is_apple_check = false;//获取苹果审核模式
    public $apple_pay_sandbox_model = false;//获取苹果沙箱开关
    public $android_audit_mode_swtich = false;//获取安卓审核模式
    public $apple_goods = [];
    public $active = [];
    public $recode = [];
    public $simulationLogin = false; // 是否账号模拟登陆
    public $is_cached;// redis开关
    public $cache_time;// 缓存有效期
    public $errermsg = '';

    /**
     * 初始化
     * @throws ApiException
     * @throws \Exception
     */
    protected function _initialize()
    {
        parent::_initialize();

        if ($this->CT === 2)
        {   // 小程序 或 H5
            $authCheck = new AuthCheck();
            // 该接口是否可以免登陆
            $isExemptLogin = $authCheck->getIsExemptLogin(); // true可以免登陆 false必须登陆

            if (!$isExemptLogin && !$authCheck->isLogin())
            {
                throw new ApiException('登录失效', 200, config('code.denied'));
            }

            $this->user = $authCheck->user;
            $this->miniInfo = $authCheck->miniInfo;
            $this->simulationLogin = $authCheck->simulationLogin;

            if ($this->user && $this->user['forbidden'] == 1)
            {
                throw new ApiException('登录失效', 200, config('code.denied'));
            }
        } else
        {   // APP
            $apple_info = (new Goods())->getAppAppleInfo();
            $this->apple_goods = $apple_info['apple_goods'];//获取苹果商品信息
            $this->is_apple_check = $apple_info['is_apple_check'];//获取苹果审核模式
            $this->apple_pay_sandbox_model = $apple_info['apple_pay_sandbox_model'];//获取苹果沙箱状态
            $this->android_audit_mode_swtich = $apple_info['android_audit_mode_swtich'];//获取安卓审核模式
            $this->is_apple_pay = $apple_info['is_apple_pay'];//获取苹果支付模式，控制苹果商品显示

            if (!$this->isLogin())
            {
                if ((empty($this->user) || !isset($this->user['id']) || !$this->user['id']))
                {
                    throw new ApiException($this->errermsg, 200, config('code.denied'));
                }
            }

            // 判断是否需要绑定手机号 true=>需要 false=>不需要
            if ($this->isMustBindTel())
            {
//                Log::write('根据网络安全法要求，请先绑定手机号：' . json_encode(request()->header()), 'error', true);
                throw new ApiException('根据网络安全法要求，请先绑定手机号', 200, 407);
            }

            if (!$this->hasRecordCheck())
            {
                throw new ApiException('用户' . $this->user['id'] . '档案缺失', 200, 406);
            }

            if (!$this->OrdersVervsion())
            {
                throw new ApiException('请下载最新版APP查看订单', 200, 0);
            }
        }
    }

    /**
     * 判定是否登录
     * @throws ApiException
     */
    public function isLogin()
    {
        if (!isset($this->headers['access-token']) || $this->headers['access-token'] == '') throw new ApiException('前往登录', 200, 405);
        // access-token AES解密
        $accessUserToken = (new Aes())->decryptWithOpenssl($this->headers['access-token']);

        if (empty($accessUserToken)) throw new ApiException('前往登录', 200, 405);

        if (!preg_match('/||/', $accessUserToken))
        {
            $this->errermsg = '您的账户登录过期，请重新登录。';
            return false;
        }

        [$token, $id] = explode('||', $accessUserToken);

        $id = (int)($id);
        // 账号模拟
        $simulation = config('app.simulation');

        if ($id !== $simulation['from'])
        {
            $map['id'] = $id;
            $map['token'] = $token;
        } else
        {
            $map['id'] = $simulation['to'] ?: $id;
            if ($map['id'] === $simulation['to'])
            {   // 模拟登陆
                $this->simulationLogin = true;
            }
        }

        $userinfo = (new User())->getUserinfo($map);

        if (!$userinfo || empty($userinfo))
        {
            $this->errermsg = '当前账号登录过期，请您重新登录。';
            return false;
        }

        if ($userinfo['forbidden'] == 1)
        {
            $this->errermsg = '您的账户登录过期，请重新登录。';
            return false;
        }

        // 判定时间是否过期
        if (isset($map['token']) && time() > $userinfo['token_expire'])
        {
            $this->errermsg = '您的账户登录过期，请重新登录。';
            return false;
        }

        $this->user = $userinfo;
        /**
         * 定义全局常量 UID 方便日志打印带上用户ID信息
         */
        if (!defined('USERINFO_UID'))
        {
            define('USERINFO_UID', $userinfo['id']);
        }

        return true;
    }

    /**
     * 获取档案
     * @param int $rid1
     * @param int $rid2 【可选】
     * @return array|false|\PDOStatement|string|\think\Model
     * @throws ApiException
     */
    public function getRecode(int $rid1 = 0, int $rid2 = 0)
    {
        $recode2 = null;

        try
        {
            if ($rid1 > 0)
            {
                $recode1 = Db::table('app_recode')
                    ->field('id,uid,name,type,year,month,day,hour,minute,timezone,long_deg,long_min,ew,lat_deg,lat_min,ns,is_summer,comments')
                    ->where(['id' => $rid1, 'uid' => $this->user['id']])
                    ->findOrFail();
            } else
            {
                $recode1 = Db::table('app_recode')
                    ->field('id,uid,name,type,year,month,day,hour,minute,timezone,long_deg,long_min,ew,lat_deg,lat_min,ns,is_summer,comments')
                    ->where(['isself' => 1, 'uid' => $this->user['id']])
                    ->cache('user_recode_' . $this->user['id'], 86400 * 3)
                    ->findOrFail();
            }
            if ($rid2 > 0)
            {
                $recode2 = Db::table('app_recode')
                    ->field('id,uid,name,type,year,month,day,hour,minute,timezone,long_deg,long_min,ew,lat_deg,lat_min,ns,is_summer,comments')
                    ->where(['id' => $rid2, 'uid' => $this->user['id']])
                    ->findOrFail();
            }
        }
        catch (\Exception $e)
        {
            // 错误信息写入日志
            \think\Log::write(var_export(request()->param()), 'recode_error01', true);
            \think\Log::write($e->getMessage(), 'recode_error03', true);

            throw new ApiException('用户' . $this->user['id'] . '档案信息获取失败');
        }

        if ($rid2 === 0) return $recode1;

        else return [$recode1, $recode2];
    }

    /**
     * 是否具有档案检查
     * @throws \Exception
     */
    public function hasRecordCheck()
    {
        if (isset($this->user['rid']) && $this->user['rid'])
        {   // 判断用户是否有自己的档案 有则返回true
            return true;
        }

        // 没有自己的档案
        $rid = input('rid/d', 0);
        $rid1 = input('rid1/d', 0);
        if ($rid || $rid1)
        { // 请求参数含有 档案ID
            $rid = $rid ?: $rid1;
            $recodeInfo = (new \app\common\cachemodel\Recode())->getInfoById($rid, ['uid']);
            if ($recodeInfo['uid'] == $this->user['id'])
            {
                return true;
            }
        }
        $model = $this->request->module();
        $controller = $this->request->controller();
        $startNum = strpos($controller, '.');
        if ($startNum !== false)
        {
            $controller = substr($controller, $startNum + 1);
        }
        $action = $this->request->action(); // 全小写

        $uri = $model . '.' . $controller . '.' . $action;

        //添加免档案验证接口数据
        $neednotRecordData = [
            'divination.index.history',         // 提问列表
            'divination.index.delete',         // 提问列表删除
            'divination.index.divination',      // 卜卦
            'divination.index.get',         // 提问
            'divination.index.specialty',   // 骰子专业模式
            'divination.index.dice',        // 骰子经典模式
            'divination.note.update',        // 提问笔记更新
            'divination.note.delete',        // 提问笔记删除
            'api.divinationnote.index',        // 提问笔记列表
            'api.divinationnote.save',        // 提问笔记添加
            'api.personal.index',           // 个人中心
            'api.orders.index',             // 订单中心
            'api.orders.read',              // 订单详情
            'api.message.is_read',          // 消息中心
            'api.message.index',            // 消息列表
            'api.message.change_read',      // 消息已读
            'article.index.reply_me',       // 回复我的
            'api.messagecenter.del_message', // 消息删除
            'api.messagecenter.read_message', // 消息已读
            'api.messagecenter.all_read_message', // 消息全部已读
            'web.vip.vip_center',           // 会员中心
            'lucky.planet.get_my_lucky',    // 我的幸运星
            'api.coupon.index',             // 卡券中心
            'api.coupon.giverecordlist',    // 优惠券赠送记录
            'api.coupon.giverecorddetail',  // 优惠券获赠详情
            'api.coupon.codesearch',        // 卡券兑换搜索
            'api.coupon.codeget',           // 卡券兑换领取
            'api.coupon.getorderusable',    // 获取下单可用优惠券
            'api.coupon.getusablenum',      // 获取下单可用优惠券数量
            'api.coupon.coupongive',        // 优惠券赠送
            'api.user.uensearch',           // 准了号用户搜索
            'api.vip.getrankinglist',       // vip排行榜
            'api.user.vipgrowrecord',       // vip星力值成长记录
            'api.coupon.activegetcoupon',   // 活动优惠券领取 （首页公告框）
            'api.coupon.del',   // 优惠券删除
            'api.orders.close_order',       // 关闭订单
            'api.goods.read',               // 获取商品信息
            'api.goods.recommend_commodities', // 获取推荐商品信息
            'api.orders.free_pay_unlock',   // 免费下单
            'api.orders.pay_again',         // 重新支付
            'api.logoutaccount.index',      //注销
            'api.logoutaccount.getcode',    //注销
            'api.logoutaccount.getwechatinfo', //注销
            'api.logoutaccount.out',        //注销
            'api.logoutaccount.getuserinfo', //注销 获取三方信息
            'api.videoforteach.my_course',  // 我的课程
            'user.userinfo.my_collect',     // 我的收藏
            'article.index.details',        // 文章详情
            'api.article.category',        // 文章分类
            'article.index.collect',        // 文章收藏
            'article.index.good',           // 文章点赞
            'article.index.comment',        // 文章评论
            'article.index.reply_lists',    // 回复列表
            'article.index.reply',          // 评论回复
            'api.commentforteach.against_save', // 评论举报
            'article.index.comment_good',   // 评论点赞
            'article.index.comment_delete', // 评论删除
            'article.index.comment_lists',  // 文章评论列表
            'api.collect.del',              // 内容收藏删除
            'lucky.planet.index',           // 获取今日幸运用户
            'lucky.planet.get',             // 领取幸运星
            'api.recode.index',             // 档案列表
            'recode.cat.bg_lists',          // 档案袋背景图列表
            'recode.cat.add',               // 添加档案袋
            'recode.cat.edit',               // 编辑档案袋
            'recode.cat.del',               // 添加档案袋
            'recode.cat.lists',             // 档案袋列表
            'recode.index.lists_with_cat',  // 查询用户档案列表
            'recode.index.add',             // 添加档案
            'recode.index.avatar',           // 上传头像
            'recode.index.moveout_cat',           // 删除档案袋
            'recode.cat.recodes',           // 获取档案袋档案列表
            'recode.index.move_in_cat',     // 多档案批量移入单个档案袋
            'api.physicalstore.orders',     // 商品订单
            'api.videoforteach.course_detail',  //课程详情
            'api.videoforteach.getststoken', // 获取播放token
            'api.videoforteach.course_comment', // 课程详情
            'api.orders.pay_unlock',        // 去支付
            'api.orders.del',               // 订单删除
            'article.index.fortune_week_detail', // 十二星座周运
            'article.index.fortune_month_detail', // 十二星座月运
            'article.index.fortune_year_detail', // 十二星座年运
            'api.videoforteach.index',
            'api.commentforteach.support_or_deny', // 课程评论点赞/点踩
            'api.commentforteach.save',         // 课程评价
            'api.commentforteach.update',       // 课程评价编辑
            'api.videoforteach.save_section_progress',  // 获取课程练习接口
            'api.videoforteach.save_section_exercise_progress', // 课程练习接口
            'api.push.bind', // 推送绑定
            'recode.index.add', // 档案添加
            'api.index.index',   // 首页接口
            'api.info.bind_tel', // 绑定手机号
            'api.info.change_tel', // 更新绑定手机号
            'api.astroset.index', // 星盘配置列表
            'api.astroset.update', // 星盘配置更新
            'api.astroset.restore', // 星盘配置还原
            'push.bind.save',   // 旧版推送设备绑定
            'api.coin.coingoods',   // 准币商品
            'api.coin.coinrecharge',   // 准币充值
            'api.coin.coinpay',   // 准币下单
            'api.coin.coindetail',   // 准币明细
            'api.coin.coinnum',   // 准币钱包
            'api.planet.get',   // v14领取幸运星
            'api.apppayverify.index',   // 苹果支付认证

            'api.newyearactiv.getcoupon', // 春节活动1
            'api.newyearactiv.getactivcoupon', // 春节活动2
            'web.newyearactiv.index', // 春节活动h5

            'api.yearactivsix.getcoupon', // 六周年活动1
            'api.yearactivsix.getactivcoupon', // 六周年活动2
            'web.yearactivsix.index', // 六周年活动h5

            'api.youngmodel.change', // 更新青少年模式状态
            'api.youngmodel.getstatus', // 获取青少年模式状态
            'web.question.index', // 问卷调查方法
            'api.push.notice',//通知列表
            'api.push.changenotice',//修改通知状态
            'api.info.bind_tel',//绑定手机号
            'api.info.change_tel',//更换手机号
            'api.info.bind_third',//三方绑定
            'api.info.ubind_third',//三方解绑
            'api.complain.appeal',//违规申诉
            'api.article.comment',//文章评论
            'api.article.reply',//文章评论回复
            'api.articlecommentpost.comment',// 文章评论
            'api.articlecommentpost.commentreply',// 文章评论回复
            'api.articlecommentpost.replyme',//回复我的
            'api.contentdispose.complain',//添加举报
            'api.contentdispose.content_good',//点赞/取消点赞（内容）
            'api.contentdispose.comment_good',//点赞/取消点赞（评论/回复）
            'api.contentdispose.del',//删除（评论/回复）
            'api.collect.save',//收藏 / 取消收藏
            'api.collect.index',//收藏列表
            'api.articlecommentpost.comment',//添加评论
            'api.articlecommentpost.commentreply',//添加回复
            'api.recode.getupdatestatus',//获取档案更新状态
            'api.recode.updatenotify',//档案更新成功通知
            'api.recodecat.getrecodecat',//档案袋图片列表
            'api.staractiv.getquestion',// 占星师挑战活动挑战接口
            'api.staractivranking.getranking',//占星师挑战活动排行榜接口
            'api.mallorder.order_check',//商城下单确认
            'api.addressmanage.index',//收货地址列表
            'api.addressmanage.addoredit',//收货地址添加或者编辑
            'api.addressmanage.del',//删除收货地址
            'api.mallstore.goods_list',//实体商品列表
            'api.mallstore.goods_detail',//实体商品详情
            'api.mallstore.recommend_goods',//实体推荐商品
            'api.mallorder.pay_order',//实体商品下单
            'api.mallorder.order',//实体商品订单详情
            'api.mallorder.receiptgoods',//实体商品确认收货
            'api.mallorder.kdinfo',//实体商品 物流信息

            'api.divination.getrecommendquestion',  // 获取占卜推荐问题
            'api.userdivination.tarotadd',  // 塔罗占卜
            'api.userdivination.gettarotdetail',    // 获取塔罗结果
            'api.userdivination.gettarotlist',  // 获取塔罗占卜历史记录
            'api.userdivination.tarotdel',  // 删除塔罗记录

            'api.feedback.redirecturl', //  把header参数传入到url里
            'api.feedback.gethotquestionlist',  // 获取热门问题列表
            'api.feedback.gethotquestiondetail',    // 获取热门问题详情
            'api.feedback.gettag',  // 获取意见反馈标签
            'api.feedback.getfeedbacklist', // 获取历史反馈列表
            'api.feedback.getfeedbackdetail',   //获取历史反馈列表
            'api.feedback.feedbackadd', //意见反馈
            'api.feedback.feedbackreply',   // 意见反馈会话回复
            'api.feedback.newreplymsg', // 获取意见反馈最新回复

            'api.user.getloginrecord',  // 获取登陆设备记录
            'api.user.setloginrecordstatus',    // 设置记录登陆设备日志状态
            'api.user.loginrecorddel',  // 删除登陆设备记录
            'api.user.getinfo',  // 个人中心
            'api.coin.setpassword',  // 设置支付密码
            'api.coin.resetpassword',  // 忘记支付密码
            'api.planet.del',   // v21幸运星删除

            'api.info.alter_name',  // 更新昵称
            'api.info.alter_avatar',    // 更新头像
            'api.interact.msg',     // 互动消息

            //补偿活动
            'webactive.compensateactive.index',
            // 开盲盒活动
            'webactive.active.index',
            'webactive.active.shareindex',
            'webactive.active.prizerecords',
            'webactive.active.luckydraw',
            'webactive.active.task',
            'webactive.active.getprizerecordlist',
            'webactive.active.getprizeinfo',
            'web.yearactiv2021.index', // 春节活动
            'api.yearactiv.getactivcoupon', // 春节活动
            'api.yearactiv.getcoupon', // 春节活动
            'web.active.worksday2021',// 2021五一活动
            'web.active.ac20210610',// 2021高考助力活动
            'api.sixoneactive.givecoupon', // 高考助力领取优惠券

            'api.push.getnoticeinfo',   // 获取通知状态信息
            'api.push.setnoticestatus', // 获取通知状态信息
            'api.mentaltest.redirecturl', // 心理测试-把app里的header里的内容通过参数传到webview里
            'api.mentaltest.getquestionlist', // 心理测试-获取心理测试列表
            'api.mentaltest.getquestiondetail', // 心理测试-获取问题详情
            'api.mentaltest.pay', // 心理测试-支付接口
            'api.mentaltest.getpayresult', // 心理测试-支付接口
            'api.mentaltest.getoptionlist', // 心理测试-获取问题的所有选项
            'api.mentaltest.gethistoryrecords', // 心理测试-获取我的测评列表
            'api.mentaltest.submitanswer', // 心理测试-提交答案
            'api.mentaltest.redirectresulturl', // 心理测试-跳转到结果页
            'api.fortune.note', // 运势日记列表 免档案
            'api.fortune.dayfortunehistory', // 历史日运
            'api.map.maphistory',   // 历史地图
            'api.map.mapdetailhistory', // 历史地图地点详情
            'api.synastryreport.getdetails', // 合盘恋爱下单介绍页
            'api.synastryreport.getlist',   // 合盘恋爱报告列表
            'api.recode.delete',    // 档案删除
            'api.recode.update',    // 档案编辑
            'api.astrolabe.index', // 星盘数据
            'web.synastryreport.index', //合盘恋爱报告
            'api.horoscope.index', // 八字排盘免档案
            'recode.index.cat',     // 档案添加进档案袋

            'api.userlive.sendmessage', // 直播发送弹幕
            'api.userlive.bagchangelist', // 背包礼物变动记录
            'api.userlive.sendgifts', // 直播间赠送礼物
            'api.userlive.givecoupon', // 直播间抢优惠券

            'web.live.index2',// 直播间免档案

            'api.liveadmin.redirecturl',// 个人中心-主播管理员  点击
            'api.liveadmin.mylives', // 主播管理-我的主播
            'api.livertc.getrtcauth',   // 获取连麦token
            'api.livertc.requestrtc',   // 申请连麦
            'api.livertc.requestrtcdel',    // 取消申请连麦
            'api.livertc.rtcquestionadd',   // 连麦问题补充
            'api.livertc.requestrtcinteraction',    // 连麦交互

            'api.postersheareactive.isjoinactive',    // 是否参与本期活动
            'api.postersheareactive.getrankinglist',    // 获取排行榜列表
            'api.postersheareactive.zan',    // 海报投票/取消投票
            'api.postersheareactive.getzanrecord',    // 获取投票记录
            'api.postersheareactive.getlists',    // 海报列表
            'api.postersheareactive.report',    // 海报举报
            'api.postersheareactive.posterread',    // 海报已读
            'api.postersheareactive.getmyposter',    // 我的海报

            'api.liveuser.subscribelive',    // 直播预约
            'api.yearactiv.index',  // 2022春节活动 首页
            'api.yearactiv.getactivcoupon',  // 2022春节活动 抢券
            'api.yearactiv.signin',  // 2022春节活动 签到
            'api.yearactiv.sharegive',  // 2022春节活动 分享领取
            'api.yearactiv.knownewtext',  // 2022春节活动 确认收下
            'api.yearactiv.exchangecoupon',  // 2022春节活动 兑换 优惠券
            'api.yearactiv.sendtext',  // 2022春节活动 赠送字

            // 直播解答
            'api.liveuseranswerinfo.rewardlist',    // 获取打赏列表
            'api.liveuseranswerinfo.rewardanswer',    // 打赏解答
            'api.liveuseranswerinfo.commentanswer',    // 评价解答
            'api.liveuseranswerinfo.requestastroanswer',    // 申请看盘
            'api.liveuseranswerinfo.alterrequestastroanswer',    // 更新看盘申请
            'api.liveuseranswerinfo.answerdetailinfo',    // 获取解答状态信息
            'api.liveuseranswerinfo.alteranswerstatus',    // 修改解答状态
            'api.liveuseranswerinfo.requestdiceanswer',    // 骰子申请
            'api.liveuseranswerinfo.requesttarotanswer',    // 塔罗申请
            'api.liveuseranswerinfo.answerorderdetail',    // 订单解答详情
            'api.orders.submitanswer',    // 提交解答
            'api.orders.getorderpayrecommend',              // 获取订单推荐商品
            // 问答
            'api.userquestionanswer.gettarotordice',    // 获取塔罗｜骰子结果
            'api.questionmessage.index',    // 问答消息列表
            'api.userquestionanswer.getaskquestionintro',    //  获取提问信息 发布问题介绍
            'api.userquestionanswer.questionadd',    // 发布问题
            'api.userquestionanswer.getappealtag',    // 获取申述标签
            'api.userquestionanswer.questionappeal',    // 问题答案申述
            'api.userquestionanswer.getcommenttag',    // 获取评价标签
            'api.userquestionanswer.answercomment',    // 问答问题评价
            'api.userquestionanswer.addquestion',    // 提交追问
            'api.userquestionanswer.getanswerdetail',    // 问答问题 答案详情
            'api.userquestionanswer.getmyquestions',    // 我的问答
            'api.userquestionanswer.delmyquestions',    // 删除问题记录
            'api.userquestionanswer.readview',    //    蹭看已读
            'api.userquestionanswer.questioncomment',    //  问题讨论（评论）
            'api.userquestionanswer.commentreply',    //     问题讨论（评论）回复
            'api.userquestionanswer.getuserquestioncomment',    // 获取用户问题评价
            'web.lotto.index',    // 幸运星 抽奖 H5
            'api.luckyplanet.index',            // 幸运星首页
            'api.luckyplanet.exchangedatalists',    // 兑换列表
            'api.luckyplanet.history',          // 幸运星记录
            'api.luckyplanet.setaddress',       // 更换|选择收货地址
            'api.luckyplanet.profile',          // 个性装扮详情
            'api.luckyplanet.saveadorns',       // 保存装扮
            'api.luckyplanet.gettaskstar',      // 领取 幸运星任务幸运星
            'api.luckyplanet.signin',           // 签到
            'api.luckyplanet.adornexchange',    // 确认兑换装扮
            'api.luckyplanet.recycleknow',      // 旧幸运星销毁知晓
            'api.luckyplanet.draw',             // 幸运星抽奖
            'api.luckyplanet.tasksuccess',      // 幸运星 每日任务完成
            'api.luckyplanet.getluckyisnew',    // 获取幸运星小红点状态
            'api.userastrcommunity.articlezan', // 星座讨论 赞同与反对
            'api.userastrcommunity.createarticle', // 星座讨论 发布讨论
            'api.userastrcommunity.delarticle', // 星座讨论 删除讨论
            'api.userastrcommunity.articlecomment', // 星座讨论 评论与回复
            'api.userastrcommunity.communityhome', // 星座讨论 个人主页
            'api.userrelationanalysis.getmyideacasedetail',     // 我的理想型 方案详情
            'api.userrelationanalysis.submitcase',     // 我的理想型 提交方案
            'api.userrelationanalysis.getmyideacaselist',     // 我的理想型 方案列表
            'api.userrelationanalysis.myideacaseaddrecode',     // 我的理想型 方案 添加档案

            'api.userrelationanalysis.MyIdeaCaseDelete',    // 我的理想型 方案 删除
            'api.userrelationanalysis.getfollowlist',       // 获取 怎么追求Ta 解锁记录列表
            'api.userrelationanalysis.getcheckplayerlist',  // 获取 鉴“渣”神器 解锁记录列表
            'api.userrelationanalysis.reportdel',           // 关系研究所【怎么追求Ta ｜ 鉴“渣”神器】 报告删除

            'api.webactive.index',     // 七夕活动     首页
            'api.webactive.signin',     // 七夕活动     签到
            'api.webactive.getsignincoupon',     // 七夕活动   领取签到优惠券
            'api.webactive.gethelpdetail',     // 七夕活动  获取助力详情
            'api.webactive.helpuser',     // 七夕活动   给用户助力
            'api.webactive.gethelpcoupon',     // 七夕活动 领取助力优惠券

            'api.upload.upload',    // 文件上传

            'web.relationresearchfityou.follow', //关系研究所-怎么追求Ta
            'web.relationresearchfityou.check_player', //关系研究所-鉴渣

            'api.userastrofortunechange.detaillist', // 星运变动 列表详情
            'api.userastrofortunechange.getsurprisedata', // 开启神秘惊喜
            'api.userastrofortunechange.astrofortunechangezan', // 星运变动词条 有感与无感

            'api.astruserfortunearticle.getarticlelist', // 星运变动 动态列表
            'api.astruserfortunearticle.getarticledetail', // 星运变动 动态详情
            'api.astruserfortunearticle.createarticle', // 发布 星运变动 动态
            'api.astruserfortunearticle.delarticle', // 删除 星运变动 动态
            'api.astruserfortunearticle.articlezan', // 星运变动 动态 同感与无感
            'api.astruserfortunearticle.articlecomment', // 星运变动 动态 评论或评论回复

            'api.iosactive.getcoupon', // ios 感恩回馈

            'api.moodnote.index',   // 心情笔记首页
            'api.moodnote.list',
            'api.moodnote.save',
            'api.moodnote.update',
            'api.moodnote.del',
            'api.moodnote.getmoodandtag',
            'api.moodnote.signcalendar',

            'api.blacklist.add',        // 黑名单添加
            'api.blacklist.getlist',    // 黑名单列表
            'api.blacklist.del',        // 黑名单删除

            'api.aianswer.getaicontent',//获取AI解答内容
            'api.aianswer.getstreamcontent',//获取流式AI解答内容
            'api.aianswer.checkquestion',//检测问题Ai是否能回答

            'web.aiactive.questionlist',
            'web.aiactive.questiondetail',
            'web.aiactive.assist',
            'web.aiactive.saverecode',

            'api.aiuserchat.getchatidlist', // 获取对话记录列表
            'api.aiuserchat.delchatid', // 删除对话记录
            'api.aiuserchat.sendquestion', // 发送对话
            'api.aiuserchat.getquestionanswerstream', // 获取流式结果
            'api.aiuserchat.questionsentence', // 问题澄清
            'api.aiuserchat.zan', // 点赞 ｜ 踩
            'api.aiuserchat.divinationstart', // 开始占卜

            'api.aiuserchat.dicequestion', // AI会话 开始占卜问题   2.10.5

            'api.useraichat.submittarotquestion', //  AI会话塔罗提问
            'api.useraichat.unlocktarot', //  解锁 AI会话塔罗提问
            'api.useraichat.verifytarotquestion', //  AI会话塔罗提问安全验证
            //  连线咨询  --------------
            'api.coupon.getconsultrtccouponlist', // 获取连线咨询优惠券列表
            'api.userconsultchat.getconsultchatrecord', // 获取 咨询对话 记录
            'api.userconsultchat.sendconsultmsg', // 发送 咨询 消息
            'api.userconsultchat.sendconsultquestion', // 发送 咨询 问题
            'api.userconsultchat.getastrask', // 【立即｜更换】咨询
            'api.userconsultchat.getconsultchatidlist', // 获取 咨询对话记录 列表
            'api.userconsultchat.delconsultchatid', // 删除 咨询对话记录
            'api.userconsultchat.chatsendrecode', // 向 会话占星师发送 星盘
            'api.userconsultchat.requestrtcinteraction', // 发起 RTC连麦 交互请求
            'api.userconsultchat.rtccancel', // 挂断连线｜取消连线（未接听）
            'api.userconsultchat.getrtcconsultstatusinfo', // 获取连线咨询状态
            'api.userconsultchat.updatertcconsultsharedata', // 更新连线咨询信息
            'api.userconsultchat.comment', // 咨询评价
            'api.userconsultchat.recommend', // 连线咨询 推荐占星师
            'api.userconsultchat.rtcchatdetail', // 咨询详情
            'api.userconsultchat.rtcchatlist', // 我的咨询列表
            'api.userconsultchat.reportastr', // 举报占星师
            'api.userconsultchat.consultchatmsgread', // 咨询消息已读
            'api.userconsultchat.follow', // 关注取消关注
            'api.userconsultchat.astrfollowlist', // 咨询师关注列表
            'api.userconsultchat.getcancelreason', // 获取 故障挂断 原因
            'api.userconsultchat.getcommenttag', // 获取评价标签
            //  连线咨询 礼包  --------------
            'api.userconsultchat.giftdetail', // 获取 咨询礼包详情
            'api.userconsultchat.mygiftlist', // 我的咨询礼包列表
            'api.userconsultchat.getastrusablegift', // 获取 占星师可用礼包
            'api.userconsultchat.buygift', // 购买连麦礼包

            //  优质连线直播间  --------------
            'api.goodrtcliveuser.sendmsg', // 发送 弹幕
            'api.goodrtcliveuser.msgreport', // 弹幕举报
            'api.goodrtcliveuser.userdisenablespeak', // 用户禁言
            //  意见反馈  --------------
            'api.feedback.getfeedbacklist',    // 获取 反馈历史
            'api.feedback.addfeedbackmsg',    // 发送反馈消息
            'api.feedback.getservicelist',    // 获取 服务列表

            'api.aiuserchat.insertstatusmsg', // 会话插入 语音通话固定与语
            'api.aiuserchat.getstttoken', // 获取 语音转文本 token

            'api.userdivination.tarotsave',  // 塔罗记录添加
            'api.userdivination.tarotinfo',  // 塔罗详情
            'api.userdivination.gettarotaianswerdetail',  // 获取 塔罗 ai解答 记录详情
            'api.userdivination.tarotcardaiunlock',  // 塔罗 卡牌 ai解锁
            'api.userdivination.gettarotcardaianswerstream',  // 获取塔罗ai解锁流式输出
            //  后天星座  --------------
            'api.acquiredastrouser.mylist', // 后天星座 我的测试
            'api.acquiredastrouser.starttest', // 后天星座 开始 测试
            'api.acquiredastrouser.testsubmit', // 后天星座 提交 测试答案
            'api.acquiredastrouser.getteststatus', // 后天星座 获取 测试状态
            'api.acquiredastrouser.gettestresult', // 后天星座 获取 测试结果


            // 星愈聊天室
            'api.aichatroomuser.getroomcreateintro',    // 获取创建聊天室介绍
            'api.aichatroomuser.createskip',    // 暂时跳过
            'api.aichatroomuser.randomavatar',  //  随机获取头像
            'api.aichatroomuser.matchastr',     //  匹配星盘信息
            'api.aichatroomuser.createoreditroom',  // 创建聊天室
            'api.aichatroomuser.getroomlist',   // 我的伙伴列表
            'api.aichatroomuser.delroomid', // 删除聊天室 伙伴
            'api.aichatroomuser.getroomchatdetails',    // 获取聊天室 对话记录详情
            'api.aichatroomuser.getroomconfig', // 获取聊天室配置
            'api.aichatroomuser.sendmsg',   //  发送消息
            'api.aichatroomuser.getmsgstream',  // 获取流式消息
            'api.aichatroomuser.changestoryline',   //  更换 剧情信息
            'api.aichatroomuser.reportinfo',    // 获取举报原因
            'api.aichatroomuser.report',    // 举报
            'api.aichatroomuser.chatstop',  // 停止计时
            'api.aichatroomuser.getdurationtaskinfo',   // 时长任务详情
            'api.aichatroomuser.durationtasksuccess', // 时长任务完成

            // 连线咨询
            'api.userconsultchat.userreservationlist', // 获取可预约信息
            'api.userconsultchat.userreservation', // 预约
            'api.userconsultchat.cancelreservation', // 取消预约

            'api.userconsultchat.sendgift', // 赠送 连线咨询礼物

            //  八字起名
            'api.usernameanalyze.getrecordlist', // 获取评分｜起名记录
            'api.usernameanalyze.getcreatenamedetail', // 获取取名结果
            'api.usernameanalyze.getanalyzewuxingresultstream', // 获取 名字五行分析结果流
            'api.usernameanalyze.getanalyzeresult', // 获取 名字评分分析结果

            'api.recode.parsetextrecode',    // 档案信息 解析
            'api.appcompensation.give', // 服务异常 补偿领取
        ];
        $lowerUri = strtolower($uri);

        if (in_array($lowerUri, $neednotRecordData, true))
        {
            return true;
        }
        if (Util::CheckAppVersion('2.6.0') === '小')
        {
            return false;
            //将用户最小的档案id处理为自己的档案
//            return $this->selfRecodeManage($uri);
        }
        return false;
    }

    /**
     * 处理用户缺失自己档案问题
     */
    protected function selfRecodeManage($uri)
    {
        //钉钉通知地址
        $ding_url = 'https://oapi.dingtalk.com/robot/send?access_token=27a909ef0996939291d24bc1b0f26fcb505cca2b3a9d86adb4f0bec6d6ff276c';
        $recodeModel = new \app\common\cachemodel\Recode();
        $msg = '';
        //获取档案的最小id
        try
        {
            $recode = $recodeModel->where('uid', $this->user['id'])->where('status', 1)->field('id,comments,isself')->order('id', 'asc')->findOrFail()->toArray();
            if ($recode['isself'] == 1 && $recode['comments'] == '自己')
            {
                Cache::rm('userinfo:' . $this->user['id']);
                return true;
            }
            $rid = $recode['id'];
        }
        catch (\Exception $e)
        {
            $rid = 0;
            $recode['comments'] = '朋友';
            $msg .= '获取最小rid失败：【' . $e->getMessage() . '】，';
            Log::write($this->user['id'] . '获取最小rid失败：【' . $e->getMessage() . '】', 'log', true);
        }
        if ($rid)
        {
            //将这些用户的id最小的档案改为自己的档案，处理为isself=1 ， comments=自己
            try
            {
                $this->user['rid'] = $rid;
                $recodeModel->where('id', $rid)->update(['isself' => 1, 'comments' => '自己']);
                $msg .= '用户' . $this->user['id'] . '的档案' . $rid . '由' . $recode['comments'] . '修改成自己，';
            }
            catch (\Exception $e)
            {
                $msg .= '更新档案信息失败：【' . $e->getMessage() . '】，';
                Log::write($this->user['id'] . '获取最小rid失败：【' . $e->getMessage() . '】', 'log', true);
            }
            //删除缓存
            try
            {
                Cache::rm('userinfo:' . $this->user['id']);
                $msg .= '删除用户信息缓存成功。';
            }
            catch (\Exception $e)
            {
                $msg .= '删除用户信息缓存失败。';
            }
            $msg .= '请求接口：' . $uri;
            //发送钉钉消息
            $href_url = Env::get('host.admin_domain') . '/admin/search/search.html?type=id&keyword=' . $this->user['id'];
            Util::sendDingMsg($ding_url, Env::get('host.name') . '修复档案缺失问题', $msg, 2, $href_url);
            return true;
        }
        return false;
    }

    /**
     * 检测订单版本
     * @return bool
     */
    public function OrdersVervsion()
    {
        $controller = $this->request->controller();//控制器
        $action = $this->request->action();//请求的方法 例如：del
        $ver = $this->request->route('ver');//版本 例如：v14
        $ver = (int)str_replace('v', '', strtolower($ver));
        $orders = strstr(strtolower($controller), 'orders');//订单相关接口
        //需要过滤的方法名
        $action_condition = ['pay_again', 'del'];
        //若当前是请求订单的接口
        if ($orders)
        {
            //若当前不是请求订单重新支付和删除的接口
            if (!preg_match_all('#(' . implode('|', $action_condition) . ')#', strtolower($action), $wordsFound))
            {
                if ($ver < 10)
                {
                    return false;
                }
            }
        }
        return true;
    }
}
